gtk-demo: Add filtering to the settings demo
authorMatthias Clasen <mclasen@redhat.com>
Mon, 16 Dec 2019 04:48:34 +0000 (23:48 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 30 May 2020 23:30:14 +0000 (19:30 -0400)
A demo of filtering with lists was missing so far.

demos/gtk-demo/listview_settings.c
demos/gtk-demo/listview_settings.ui

index 254313923b321b523f9ece5545a032e2170076eb..944b764dd69367b35159e0836ff03e2449e1e21f 100644 (file)
@@ -3,8 +3,8 @@
  * This demo shows a settings viewer for GSettings.
  *
  * It demonstrates how to implement support for trees with GtkListView.
- *
- * It also shows how to set up sorting for columns in a GtkColumnView.
+ * It also shows how to set up sorting and filtering for columns in a
+ * GtkColumnView.
  */
 
 #include <gtk/gtk.h>
@@ -129,6 +129,8 @@ strvcmp (gconstpointer p1,
   return strcmp (*s1, *s2);
 }
 
+static GtkFilter *current_filter;
+
 static gboolean
 transform_settings_to_keys (GBinding     *binding,
                             const GValue *from_value,
@@ -140,6 +142,9 @@ transform_settings_to_keys (GBinding     *binding,
   GSettingsSchema *schema;
   GListStore *store;
   GtkSortListModel *sort_model;
+  GtkFilterListModel *filter_model;
+  GtkFilter *filter;
+  GtkExpression *expression;
   char **keys;
   guint i;
 
@@ -170,7 +175,18 @@ transform_settings_to_keys (GBinding     *binding,
                                         gtk_column_view_get_sorter (GTK_COLUMN_VIEW (data)));
   g_object_unref (store);
 
-  g_value_take_object (to_value, sort_model);
+  expression = gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "name");
+  filter = gtk_string_filter_new ();
+  gtk_string_filter_set_expression (GTK_STRING_FILTER (filter), expression);
+  filter_model = gtk_filter_list_model_new (G_LIST_MODEL (sort_model), filter);
+  gtk_expression_unref (expression);
+  g_object_unref (sort_model);
+
+  g_set_object (&current_filter, filter);
+
+  g_object_unref (filter);
+
+  g_value_take_object (to_value, filter_model);
 
   return TRUE;
 }
@@ -223,6 +239,32 @@ create_settings_model (gpointer item,
   return G_LIST_MODEL (result);
 }
 
+static void
+search_enabled (GtkSearchEntry *entry)
+{
+  gtk_editable_set_text (GTK_EDITABLE (entry), "");
+}
+
+static void
+search_changed (GtkSearchEntry *entry,
+                gpointer data)
+{
+  const char *text = gtk_editable_get_text (GTK_EDITABLE (entry));
+
+  if (current_filter)
+    gtk_string_filter_set_search (GTK_STRING_FILTER (current_filter), text);
+}
+
+static void
+stop_search (GtkSearchEntry *entry,
+             gpointer data)
+{
+  gtk_editable_set_text (GTK_EDITABLE (entry), "");
+
+  if (current_filter)
+    gtk_string_filter_set_search (GTK_STRING_FILTER (current_filter), "");
+}
+
 static GtkWidget *window = NULL;
 
 GtkWidget *
@@ -234,13 +276,22 @@ do_listview_settings (GtkWidget *do_widget)
       GListModel *model;
       GtkTreeListModel *treemodel;
       GtkSingleSelection *selection;
+      GtkBuilderScope *scope;
       GtkBuilder *builder;
       GtkColumnViewColumn *name_column;
       GtkSorter *sorter;
 
       g_type_ensure (SETTINGS_TYPE_KEY);
 
-      builder = gtk_builder_new_from_resource ("/listview_settings/listview_settings.ui");
+      scope = gtk_builder_cscope_new ();
+      gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (scope), "search_enabled", (GCallback)search_enabled);
+      gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (scope), "search_changed", (GCallback)search_changed);
+      gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (scope), "stop_search", (GCallback)stop_search);
+
+      builder = gtk_builder_new ();
+      gtk_builder_set_scope (builder, scope);
+      gtk_builder_add_from_resource (builder, "/listview_settings/listview_settings.ui", NULL);
+
       window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
       gtk_window_set_display (GTK_WINDOW (window),
                               gtk_widget_get_display (do_widget));
index 2bc197f68fed79a4ae967887bdf14da8a6bae2dc..8bf12cf496d9bcec140e2110ba35f1e3655b2d97 100644 (file)
@@ -4,6 +4,16 @@
     <property name="title" translatable="yes">Settings</property>
     <property name="default-width">640</property>
     <property name="default-height">480</property>
+    <child type="titlebar">
+      <object class="GtkHeaderBar">
+        <property name="show-title-buttons">1</property>
+        <child type="end">
+          <object class="GtkToggleButton" id="search_button">
+            <property name="icon-name">system-search-symbolic</property>
+          </object>
+        </child>
+      </object>
+    </child>
     <child>
       <object class="GtkPaned">
         <property name="position">300</property>
           </object>
         </child>
         <child>
-          <object class="GtkScrolledWindow">
+          <object class="GtkBox">
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkSearchBar">
+                <property name="search-mode-enabled" bind-source="search_button" bind-property="active" bind-flags="bidirectional"/>
+                <signal name="notify::search-mode-enabled" handler="search_enabled" object="entry"/>
+                <child>
+                  <object class="GtkSearchEntry" id="entry">
+                    <signal name="search-changed" handler="search_changed"/>
+                    <signal name="stop-search" handler="stop_search"/>
+                  </object>
+                </child>
+              </object>
+            </child>
             <child>
-              <object class="GtkColumnView" id="columnview">
+              <object class="GtkScrolledWindow">
+                <property name="hexpand">1</property>
+                <property name="vexpand">1</property>
                 <child>
-                  <object class="GtkColumnViewColumn" id="name_column">
-                    <property name="title">Name</property>
-                    <property name="factory">
-                      <object class="GtkBuilderListItemFactory">
-                        <property name="bytes"><![CDATA[
+                  <object class="GtkColumnView" id="columnview">
+                    <child>
+                      <object class="GtkColumnViewColumn" id="name_column">
+                        <property name="title">Name</property>
+                        <property name="factory">
+                          <object class="GtkBuilderListItemFactory">
+                            <property name="bytes"><![CDATA[
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <template class="GtkListItem">
   </template>
 </interface>
                         ]]></property>
+                          </object>
+                        </property>
                       </object>
-                    </property>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkColumnViewColumn">
-                    <property name="title">Value</property>
-                    <property name="factory">
-                      <object class="GtkBuilderListItemFactory">
-                        <property name="bytes"><![CDATA[
+                    </child>
+                    <child>
+                      <object class="GtkColumnViewColumn">
+                        <property name="title">Value</property>
+                        <property name="factory">
+                          <object class="GtkBuilderListItemFactory">
+                            <property name="bytes"><![CDATA[
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <template class="GtkListItem">
   </template>
 </interface>
                         ]]></property>
+                          </object>
+                        </property>
                       </object>
-                    </property>
+                    </child>
                   </object>
                 </child>
               </object>